← 返回列表

main - 副本 (3).py

📅 创建:2026-11-02 11:15:53 ✏️ 修改:2026-11-02 11:03:38 📦 大小:2868 字节
from fastapi import FastAPI, Request, HTTPException
from fastapi.responses import HTMLResponse
from fastapi.templating import Jinja2Templates
from pathlib import Path
import os
from datetime import datetime

app = FastAPI(title="My Notes 浏览器")

# 模板目录
templates = Jinja2Templates(directory="templates")

# my_notes 目录(与 main.py 同级)
NOTES_DIR = Path(__file__).parent / "my_notes"
NOTES_DIR.mkdir(exist_ok=True)  # 如果不存在自动创建


def get_python_files():
    """获取 my_notes 目录下所有 python 文件信息"""
    files = []
    for f in NOTES_DIR.iterdir():
        if f.is_file() and f.suffix.lower() == ".py":
            stat = f.stat()
            # Windows 上 st_ctime 是创建时间
            created = datetime.fromtimestamp(stat.st_ctime).strftime("%Y-%m-%d %H:%M:%S")
            files.append({
                "name": f.name,
                "created": created,
                "size": stat.st_size,
            })
    # 按创建时间倒序排列
    files.sort(key=lambda x: x["created"], reverse=True)
    return files


@app.get("/", response_class=HTMLResponse)
async def index(request: Request):
    """主页:双列显示文件名和创建时间"""
    files = get_python_files()
    return templates.TemplateResponse(
        "index.html",
        {"request": request, "files": files, "dir": str(NOTES_DIR)}
    )


@app.get("/view/{filename}", response_class=HTMLResponse)
async def view_file(request: Request, filename: str):
    """查看文件源码"""
    # 安全校验:防止路径穿越
    if "/" in filename or "\\" in filename or ".." in filename:
        raise HTTPException(status_code=400, detail="非法文件名")

    file_path = NOTES_DIR / filename
    if not file_path.exists() or not file_path.is_file():
        raise HTTPException(status_code=404, detail="文件不存在")
    if file_path.suffix.lower() != ".py":
        raise HTTPException(status_code=400, detail="只支持 .py 文件")

    # 读取源码(尽量兼容各种编码)
    try:
        content = file_path.read_text(encoding="utf-8")
    except UnicodeDecodeError:
        content = file_path.read_text(encoding="gbk", errors="replace")

    stat = file_path.stat()
    created = datetime.fromtimestamp(stat.st_ctime).strftime("%Y-%m-%d %H:%M:%S")
    modified = datetime.fromtimestamp(stat.st_mtime).strftime("%Y-%m-%d %H:%M:%S")

    return templates.TemplateResponse(
        "view_file.html",
        {
            "request": request,
            "filename": filename,
            "content": content,
            "created": created,
            "modified": modified,
            "size": stat.st_size,
        }
    )


if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=80)